package com.example.designpatterns.proxy.protection;

import com.example.designpatterns.proxy.Image;
import com.example.designpatterns.proxy.RealImage;

/**
 * ProtectedImage类 - 保护代理示例
 * 控制对图像的访问权限，只有图像所有者或管理员才能修改图像
 */
public class ProtectedImage implements Image {
    private RealImage realImage;
    private String filename;
    private long size;
    private ImageOwner owner;
    
    /**
     * 创建受保护的图像
     * @param filename 图像文件名
     * @param owner 图像所有者
     */
    public ProtectedImage(String filename, ImageOwner owner) {
        this.filename = filename;
        this.owner = owner;
        this.size = calculateImageSizeEstimate(filename);
        System.out.println("创建受保护图像：" + filename + "，所有者：" + owner.getUsername());
        
        // 这里选择立即加载真实图像，但也可以实现为懒加载
        this.realImage = new RealImage(filename);
    }
    
    /**
     * 模拟预估图像大小
     */
    private long calculateImageSizeEstimate(String filename) {
        return filename.length() * 50 + 100;
    }
    
    @Override
    public void display() {
        System.out.println("用户 " + owner.getUsername() + " 正在查看图像");
        realImage.display();
    }
    
    @Override
    public String getFilename() {
        return filename;
    }
    
    @Override
    public long getSize() {
        return realImage.getSize();
    }
    
    /**
     * 尝试修改图像（仅限所有者或管理员）
     * @param user 尝试修改的用户
     * @param newFilename 新的文件名
     * @return 是否修改成功
     */
    public boolean modifyImage(ImageOwner user, String newFilename) {
        // 检查访问权限：只有图像所有者或管理员才能修改
        if (canModify(user)) {
            System.out.println("用户 " + user.getUsername() + " 修改图像 " + filename + " 为 " + newFilename);
            this.filename = newFilename;
            return true;
        } else {
            System.out.println("访问拒绝：用户 " + user.getUsername() + " 没有权限修改图像 " + filename);
            return false;
        }
    }
    
    /**
     * 检查用户是否有权限修改图像
     * @param user 用户
     * @return 是否有修改权限
     */
    private boolean canModify(ImageOwner user) {
        // 所有者或管理员可以修改
        return user.getUsername().equals(owner.getUsername()) || user.isAdmin();
    }
    
    /**
     * 获取图像所有者
     * @return 图像所有者
     */
    public ImageOwner getOwner() {
        return owner;
    }
} 